/**
 * 
 */
package will.icecoffe.core;

import java.sql.ResultSet;
import java.util.List;

import org.springframework.orm.hibernate3.HibernateTemplate;

import will.icecoffe.utils.Page;

/**
 * 
 * 标准数据访问对象接口，定义了常用数据持久层的存取方法。
 * 
 * @author will
 *
 */
public interface DataAccessObject {
	

	/**
	 * 持久化已映射的对象，并返回持久化后的对象。在此过程中生成后的主键或非空默认值将被填充。
	 * 
	 * @param obj	需要被持久化的对象
	 * @return 返回持久化后的对象。在此过程中，
	 * @throws DataAccessException
	 */
	public void save(Object obj) throws DataAccessException;
	
	/**
	 * @param obj	更新一持久化对象，通过主键值进行判别
	 * @throws DataAccessException
	 */
	public void update(Object obj) throws DataAccessException;
	
	/**
	 * @param obj
	 * @throws DataAccessException
	 */
	public void saveOrUpdate(Object obj) throws DataAccessException;
	
	/**
	 * @param obj
	 * @throws DataAccessException
	 */
	public void delete(Object obj) throws DataAccessException;
	
	
	/**
	 * @param obj
	 * @return 返回List<Object>类型的查询结果。
	 * @throws DataAccessException
	 */
	public List<Object> find(Object obj) throws DataAccessException;
	

	/**
	 * @param pageNum
	 * @param maxResult
	 * @param queryName
	 * @param params
	 * @return 返回Page<Object>类型的查询结果。Page<T>继承自List<T>，与ArrayList<T>类似，但增加了页码、页跨度、和总页码。
	 * @throws DataAccessException
	 */
	public Page<Object> findBasedPage(int page, int rows, String queryName, Object...params) throws DataAccessException;
	
	
	/**
	 * @param queryName
	 * @param params
	 * @return 返回List<Object>类型的查询结果。
	 * @throws DataAccessException
	 */
	public List<Object> executeNamedHQLQuery(String queryName, Object...params) throws DataAccessException;
	
	/**
	 * @param queryName
	 * @param params
	 * @throws DataAccessException
	 */
	public void executeNamedHQL(String queryName, Object...params) throws DataAccessException;
	
	/**
	 * @param queryName
	 * @param resultSetMapping
	 * @param params
	 * @return 返回List<Object>类型的查询结果。
	 * @throws DataAccessException
	 */
	public List<Object> executeNamedSQLQuery(String queryName, Object...params) throws DataAccessException;
	
	/**
	 * @param queryName
	 * @param params
	 * @throws DataAccessException
	 */
	public void executeNamedSQL(String queryName, Object...params) throws DataAccessException;
	
	
	/**
	 * @param hql
	 * @return 返回List<Object>类型的查询结果。
	 * @throws DataAccessException
	 */
	@Deprecated
	public List<Object> executeHQLQuery(String hql) throws DataAccessException;
	
	/**
	 * @param hql
	 * @throws DataAccessException
	 */
	@Deprecated
	public void executeHQL(String hql) throws DataAccessException;
	
	/**
	 * @param sql
	 * @return 返回ResultSet查询结果。
	 * @throws DataAccessException
	 */
	@Deprecated
	public ResultSet executeSQLQuery(String sql) throws DataAccessException;
	
	/**
	 * @param sql
	 * @throws DataAccessException
	 */
	@Deprecated
	public void executeSQL(String sql) throws DataAccessException;
	
	public HibernateTemplate getHibernateTemplate();

	public Page<Object> findBasedPageNative(int pageNum, int maxResult, String queryName,
			Object[] params) throws DataAccessException;
	
}
